/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package fr.sorbonne.inf5.yams.model;

import fr.sorbonne.inf5.yams.exceptions.AccessDataException;
import fr.sorbonne.inf5.yams.exceptions.ConnectionBugException;
import fr.sorbonne.inf5.yams.exceptions.DeconnectionBugException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Iterator;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import fr.sorbonne.inf5.yams.model.LignePalmares;
/**
 *
 * @author Oukherfellah Riad
 * @author Dubos Romain
 */
public class PalmaresDB implements Palmares<LignePalmares>{

    private SortedSet<LignePalmares> palmares;

    public PalmaresDB() {
        palmares = new TreeSet<LignePalmares>();
        
    }

    public void ajouterLignePalmares(LignePalmares lignePalmares) {
        
            this.palmares.add(lignePalmares);
        
    }

    public Iterator<LignePalmares> iterator() {
        return new PalmaresIterator<LignePalmares>();
    }

    /**
     * Charge le palmares d'après les données d'une base de données
     */
    public void chargerPalmares() throws AccessDataException{
        try {
            Connection c = BDD.connexion();
            Statement st = c.createStatement();
            ResultSet result = st.executeQuery("SELECT * FROM palmares ORDER BY score");
            String joueur;
            int score;
            while(result.next()){
                joueur = result.getString("joueur");
                score = Integer.valueOf(result.getString("score"));
                palmares.add(new LignePalmares(joueur, score));
               
            }
        } catch (ConnectionBugException ex) {
            throw new AccessDataException();
        }catch(SQLException ex){
            throw new AccessDataException();
        }finally{
            try {
                BDD.deconnexion();
            } catch (DeconnectionBugException ex) {
                throw new AccessDataException();
            }
        }
    }

    public void sauvegarderPalmares() throws AccessDataException {
        try {
            Connection c = BDD.connexion();
            Statement st = c.createStatement();
            st.execute("DELETE FROM PALMARES");
            String sql="";
            for(LignePalmares lp : palmares){
                sql = "INSERT INTO PALMARES VALUES ('"+lp.getJoueur()+"', "+lp.getScore()+")";
                st.executeUpdate(sql);
            }
        } catch (ConnectionBugException ex) {
            System.out.println("Connect");
            throw new AccessDataException();
        }catch(SQLException ex){ex.printStackTrace();
            System.out.println(ex);
            throw new AccessDataException();
        }finally{
            try {
                BDD.deconnexion();
            } catch (DeconnectionBugException ex) {
                throw new AccessDataException();
            }
        }
    }

    

    private class PalmaresIterator<LignePalmares> implements Iterator<LignePalmares>{

        private Iterator<LignePalmares> iterator;

        public PalmaresIterator(){
            this.iterator = (Iterator<LignePalmares>) palmares.iterator();
        }
        
        public boolean hasNext() {
            return this.iterator.hasNext();
        }

        public LignePalmares next() {
            return this.iterator.next();
        }

        public void remove() {
            this.iterator.remove();
        }
        
    }

   
}
